前幾篇是以客戶的角度進行的行銷分析,這一篇『購物籃分析』(Basket Analysis)則是以商品的角度行銷,對顧客進行『交叉銷售』(cross selling)或『追加銷售』(up selling),cross selling是推薦顧客相關的商品,例如,牙刷與牙膏,而up selling 則是推薦顧客一個更好、更貴(我自己加的)的商品。最經典的例子,就是尿布與啤酒,WalMart發現美國年輕的夫妻在週五晚上去超市採購時,如果買了尿布,也會買啤酒,為什麼呢? 經過調查,周末時他們會帶幼兒去郊外野餐,所以,會同時購買者兩項商品,因此,WalMart就將尿布與啤酒擺在同一個櫃位,以方便顧客一起購買,這就是所謂的『交叉銷售』(cross selling),而要找出商品關聯的其中一項技術就是『購物籃分析』。
『購物籃』一詞早已落伍,現在超市都是『購物車』(Shopping cart),可見這個演算法很早就被發明,但是,還是非常實用,只要能找出商品採買的關聯性,就可進而利用各種策略提高公司的營收。下圖就是很好的例子:
圖片來源:Effective Cross Selling using Market Basket Analysis
購物籃分析,也稱為關聯分析(Affinity Analysis or Association Rule),要找出這種關聯,不需要高深的數學,只要一些簡單的統計,就可以挖掘出資料的背後隱藏的模式(Pattern)。
購物籃分析通常使用三個統計量:
公式如下:
圖片來源:A Gentle Introduction on Market Basket Analysis — Association Rules
舉一個範例說明,有5個購物籃,分別採買A、B、C、D、E 5種商品,依照公式計算結果如下:
圖片來源:A Gentle Introduction on Market Basket Analysis — Association Rules
詳細說明請參閱『關聯規則學習』。
首先,安裝一個很棒的套件 -- mlxtend:
pip install mlxtend
我們一樣使用 UCI 資料集 -- Online Retail.xlsx。
import pandas as pd
df = pd.read_excel('./Online Retail.xlsx')
df.info()
df['Description'] = df['Description'].str.strip()
df.dropna(axis = 0, subset=['InvoiceNo'], inplace = True)
df['InvoiceNo'] = df['InvoiceNo'].astype('str')
# 去除退貨記錄
df = df[~df['InvoiceNo'].str.contains('C')]
basket_fr = (df[df['Country']=="France"]
.groupby(['InvoiceNo', 'Description'])['Quantity']
.sum().unstack().reset_index().fillna(0)
.set_index('InvoiceNo'))
basket_fr.head(10)
basket_fr[basket_fr>0].head(10)
5. 購物籃分析不考慮數量,將數量>0的值全部轉為1。
def sum_to_boolean(x):
if x<=0:
return 0
else:
return 1
basket_fr_final = basket_fr.applymap(sum_to_boolean)
basket_fr_final.head(10)
from mlxtend.frequent_patterns import association_rules
from mlxtend.frequent_patterns import apriori
frequent_itemsets_fr = apriori(basket_fr_final, min_support = 0.06,
use_colnames = True)
frequent_itemsets_fr.sort_values('support', ascending = False).head()
圖.Support列表,顯示Support強的商品。
a_rules = association_rules(frequent_itemsets_fr, metric = "lift", min_threshold = 1)
a_rules.sort_values('lift',ascending = False)
圖.關聯性列表,第1欄與第2欄就是關聯性強的商品組合,後面欄位就是商品組合的統計量。
print( basket_fr_final['CHILDRENS CUTLERY SPACEBOY'].sum())
print( basket_fr_final['CHILDRENS CUTLERY DOLLY GIRL'].sum())
print(a_rules.iloc[50])
basket_fr_final['SET/20 RED RETROSPOT PAPER NAPKINS'].sum()
所以,不只要找商品組合性強,還要會熱銷的商品推薦給顧客,才能發大財。
** 以上程式修改自『Market Basket Analysis』。 **
知道這些高關聯性的商品組合,我們就可以採取下列措施,來增加我們的營收:
這篇文章有幾個東西沒解釋,我們留待下篇說明,讀者可參考『Association rule learning』:
另外,本文也未作完整的資料探索與分析(EDA),有興趣的讀者可參考『A Gentle Introduction on Market Basket Analysis — Association Rules』。
相關程式碼放在這裡 的 Day05 Basket Analysis 目錄。